/*
	The Gamma Engine Library is a multiplatform library made to make games
	Copyright (C) 2012  Aubry Adrien (dridri85)

	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "ge_internal.h"

//IMg sys
void CreateGlTexture(ge_Image* image);
void geRenderFont(int x, int y, ge_Font* font, u32 color, const char* txt, int len);
void geRenderFontOutline(int x, int y, ge_Font* font, u32 color, u32 outlineColor, const char* txt, int len);

//TTF fonts
ge_Font* geLoadFontTTF(ge_File* fontFile);
void FontSetSizeTTF(ge_Font* font, int px);
void geCreateFontTtf(ge_Font* font);
void FontPrintImageTtf_short(ge_Font* font, int x, int y, const unsigned short* text, u32 color, ge_Image* image);
void FontMeasureText_short(ge_Font* font, const unsigned short* text, int* width, int* height);

static u16 _ge_uni_text[8196] = { 0 };
static u8 msx[];

static ge_Font* _ge_FontSetupDebug(){
	ge_Font* font = (ge_Font*)geMalloc(sizeof(ge_Font));
	font->face = 0x0;
	font->data = NULL;
	font->size = 8;
	font->type = GE_FONT_SYS;

	font->texture = geCreateSurface(128, 128, 0x00000000);

	int c, i, j, l;
	int x, y;
	u8 *fnt;
	u32* data_ptr;
	u32* data;
	
	for(c=0, x=0, y=0; c<256; c++){
		u8 ch = c;
		data = font->texture->data + x + y * font->texture->textureWidth;
		
		fnt = &msx[ (int)ch * 8];
		for (i = l = 0; i < 8; i++, l += 8, fnt++) {
			data_ptr = data;
			for (j = 0; j < 8; j++) {
				if ((*fnt & (128 >> j))) *data_ptr = 0xFFFFFFFF;
				data_ptr++;
			}
			data += font->texture->textureWidth;
		}

		font->positions[c].x = x;
		font->positions[c].y = y;
		font->positions[c].w = 8;
		font->positions[c].h = 8;
		font->positions[c].advX = 6;
		font->positions[c].posY = 8;

		x += 8;
		if(x + 8 > 128){
			x = 0;
			y += 8;
		}
	}

	geUpdateImage(font->texture);
	return font;
}

ge_Font* geLoadFont(const char* filename){
	if(!filename || !filename[0] || !strlen(filename)){
		return _ge_FontSetupDebug();
	}

	ge_File* file = geFileOpen(filename, GE_FILE_MODE_READ | GE_FILE_MODE_BINARY);
	if(!file){
		return _ge_FontSetupDebug();
	}
	ge_Font* font = geLoadFontTTF(file);
	geFileClose(file);
	geFontSize(font, 20);

	return font;
}

void geFreeFont(ge_Font* font){
	geFreeImage(font->texture);
	geFree(font->data);
	geFree(font);
}

void geFontSize(ge_Font* font, int px){
	ge_Font* tmp_font = NULL;
	int i, x, y;
	font->size = px;
	switch(font->type){
		case GE_FONT_SYS :
			tmp_font = _ge_FontSetupDebug();
			geFreeImage(font->texture);
			font->texture = geResizeImage(tmp_font->texture, px*16, px*16, GE_NEAREST);
			font->texture->width = font->texture->textureWidth;
			font->texture->height = font->texture->textureHeight;

			x = y = 0;
			for(i=0; i<256; i++){
				font->positions[i].x = x;
				font->positions[i].y = y;
			//	font->positions[i].w = px;
				font->positions[i].w = 6 * px / 8;
				font->positions[i].h = px;
				font->positions[i].advX = 6 * px / 8;
				font->positions[i].posY = px;
			//	int adv = (font->texture->textureWidth/16);
				int adv = px;
				x += adv;
				if(x + adv > font->texture->width){
					x = 0;
					y += adv;
				}
			}
			
			geFreeFont(tmp_font);
			break;
		case GE_FONT_TTF :
			FontSetSizeTTF(font, px);
			geCreateFontTtf(font);
			break;
		default :
			break;
	}
}

void geFontSetEncoding(ge_Font* font, int encoding){
}

void geFontPrintScreen(int x, int y, ge_Font* font, const char* text, u32 color){
	geRenderFont(x, y, font, color, text, strlen(text));
	/*
	int i;
	int len = strlen(text);
	int b_x = x;
	y += font->size;

	font->texture->color = color;
	for(i=0; i<len; i++){
		if(text[i] == '\n'){
			x = b_x;
			y += font->size;
			continue;
		}
		geBlitImage(x, y-font->positions[(u8)text[i]].posY, font->texture, font->positions[(u8)text[i]].x, font->positions[(u8)text[i]].y, font->positions[(u8)text[i]].w, font->positions[(u8)text[i]].h, GE_BLIT_NOOFFSET);
		x += font->positions[(u8)text[i]].advX;
	}
	*/
}

void geFontPrintScreenOutline(int x, int y, ge_Font* font, const char* text, u32 color, u32 outlineColor){
	geRenderFontOutline(x, y, font, color, outlineColor, text, strlen(text));
}

void geFontPrintScreenUnicode(int x, int y, ge_Font* font, const unsigned short* text, u32 color){
	if(!libge_context->fontbuf){
		libge_context->fontbuf = geCreateSurface(libge_context->width, libge_context->height, 0);
	}
	ge_Image* image = libge_context->fontbuf;
	switch(font->type){
		case GE_FONT_TTF:
			memset(image->data, 0x0, image->textureWidth*image->height*sizeof(u32));
			FontPrintImageTtf_short(font, x, y, text, color, image);
			geBlitImage(0, 0, image, 0, 0, image->width, image->height, 0);
			break;
		default: return;
	}
}

void geFontPrintImageUnicode(int x, int y, ge_Font* font, const unsigned short* text, u32 color, ge_Image* image){
	switch(font->type){
		case GE_FONT_TTF:
			FontPrintImageTtf_short(font, x, y, text, color, image);
			break;
		default: return;
	}
}

void geFontPrintImage(int x, int y, ge_Font* font, const char* text, u32 color, ge_Image* image){
	int len = strlen(text);
	int i = 0;

	if(font->type == GE_FONT_SYS){
		y -= font->size;
		for(i=0; i<len; i++){
			int c = (int)text[i];
			geBlitImageToImage(x, y + font->positions[c].posY, font->texture, font->positions[c].x, font->positions[c].y, font->positions[c].w, font->positions[c].h, image);
			x += font->positions[c].advX;
		}
		geUpdateImage(image);
		return;
	}

	for(i=0;i<=len;i++)_ge_uni_text[i]=(u8)text[i];

	geFontPrintImageUnicode(x, y, font, _ge_uni_text, color, image);
}

static char _ge_fmt_buf[16384] = "";
void geFontPrintfScreen(int x, int y, ge_Font* font, u32 color, const char* fmt, ...){
	va_list opt;
	va_start(opt, fmt);
	vsnprintf( _ge_fmt_buf, (size_t) sizeof(_ge_fmt_buf), fmt, opt);
	geFontPrintScreen(x, y, font, _ge_fmt_buf, color);
}

void geFontPrintfImage(int x, int y, ge_Font* font, u32 color, ge_Image* image, const char* fmt, ...){
	va_list opt;
	va_start(opt, fmt);
	vsnprintf( _ge_fmt_buf, (size_t) sizeof(_ge_fmt_buf), fmt, opt);
	geFontPrintImage(x, y, font, _ge_fmt_buf, color, image);
}

ge_Image* geFontMakeImageUnicode(ge_Font* font, const unsigned short* text, u32 color){
	int w, h;
	geFontMeasureTextUnicode(font, text, &w, &h);
	ge_Image* img = geCreateSurface(w, h, 0x00000000);
	geFontPrintImageUnicode(0, 0, font, text, 0xFFFFFFFF, img);
	img->color = color;
	return img;
}

ge_Image* geFontMakeImage(ge_Font* font, const char* text, u32 color){
	int len = strlen(text);
	int i = 0;
	for(i=0;i<=len;i++)_ge_uni_text[i]=text[i];
	return geFontMakeImageUnicode(font, _ge_uni_text, color);
}

void geFontMeasureTextUnicode(ge_Font* font, const unsigned short* text, int* width, int* height){
	switch(font->type){
		case GE_FONT_TTF:
			FontMeasureText_short(font, text, width, height);
			break;
		default:
			break;
	}
}

void geFontMeasureText(ge_Font* font, const char* text, int* width, int* height){
	/*
	int len = strlen(text);
	int i = 0;
	for(i=0;i<len;i++)_ge_uni_text[i]=text[i];

	geFontMeasureTextUnicode(font, _ge_uni_text, width, height);
	*/
	
	int len = strlen(text);
	int i = 0;
	int mx = 0;
	int x = 0;
	int y = 0;

	for(i=0; i<len; i++){
		if(text[i] == '\n'){
			if(x > mx){
				mx = x;
			}
			y += font->size;
			continue;
		}
		x += font->positions[(u8)text[i]].advX;
	}
	if(mx == 0){
		mx = x;
	}

	*width = mx;
	*height = y + font->size + (font->size * 0.4);
}




static u8 msx[]=
"\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x42\xa5\x81\xa5\x99\x42\x3c"
"\x3c\x7e\xdb\xff\xff\xdb\x66\x3c\x6c\xfe\xfe\xfe\x7c\x38\x10\x00"
"\x10\x38\x7c\xfe\x7c\x38\x10\x00\x10\x38\x54\xfe\x54\x10\x38\x00"
"\x10\x38\x7c\xfe\xfe\x10\x38\x00\x00\x00\x00\x30\x30\x00\x00\x00"
"\xff\xff\xff\xe7\xe7\xff\xff\xff\x38\x44\x82\x82\x82\x44\x38\x00"
"\xc7\xbb\x7d\x7d\x7d\xbb\xc7\xff\x0f\x03\x05\x79\x88\x88\x88\x70"
"\x38\x44\x44\x44\x38\x10\x7c\x10\x30\x28\x24\x24\x28\x20\xe0\xc0"
"\x3c\x24\x3c\x24\x24\xe4\xdc\x18\x10\x54\x38\xee\x38\x54\x10\x00"
"\x10\x10\x10\x7c\x10\x10\x10\x10\x10\x10\x10\xff\x00\x00\x00\x00"
"\x00\x00\x00\xff\x10\x10\x10\x10\x10\x10\x10\xf0\x10\x10\x10\x10"
"\x10\x10\x10\x1f\x10\x10\x10\x10\x10\x10\x10\xff\x10\x10\x10\x10"
"\x10\x10\x10\x10\x10\x10\x10\x10\x00\x00\x00\xff\x00\x00\x00\x00"
"\x00\x00\x00\x1f\x10\x10\x10\x10\x00\x00\x00\xf0\x10\x10\x10\x10"
"\x10\x10\x10\x1f\x00\x00\x00\x00\x10\x10\x10\xf0\x00\x00\x00\x00"
"\x81\x42\x24\x18\x18\x24\x42\x81\x01\x02\x04\x08\x10\x20\x40\x80"
"\x80\x40\x20\x10\x08\x04\x02\x01\x00\x10\x10\xff\x10\x10\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x20\x20\x20\x20\x00\x00\x20\x00"
"\x50\x50\x50\x00\x00\x00\x00\x00\x50\x50\xf8\x50\xf8\x50\x50\x00"
"\x20\x78\xa0\x70\x28\xf0\x20\x00\xc0\xc8\x10\x20\x40\x98\x18\x00"
"\x40\xa0\x40\xa8\x90\x98\x60\x00\x10\x20\x40\x00\x00\x00\x00\x00"
"\x10\x20\x40\x40\x40\x20\x10\x00\x40\x20\x10\x10\x10\x20\x40\x00"
"\x20\xa8\x70\x20\x70\xa8\x20\x00\x00\x20\x20\xf8\x20\x20\x00\x00"
"\x00\x00\x00\x00\x00\x20\x20\x40\x00\x00\x00\x78\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x60\x60\x00\x00\x00\x08\x10\x20\x40\x80\x00"
"\x70\x88\x98\xa8\xc8\x88\x70\x00\x20\x60\xa0\x20\x20\x20\xf8\x00"
"\x70\x88\x08\x10\x60\x80\xf8\x00\x70\x88\x08\x30\x08\x88\x70\x00"
"\x10\x30\x50\x90\xf8\x10\x10\x00\xf8\x80\xe0\x10\x08\x10\xe0\x00"
"\x30\x40\x80\xf0\x88\x88\x70\x00\xf8\x88\x10\x20\x20\x20\x20\x00"
"\x70\x88\x88\x70\x88\x88\x70\x00\x70\x88\x88\x78\x08\x10\x60\x00"
"\x00\x00\x20\x00\x00\x20\x00\x00\x00\x00\x20\x00\x00\x20\x20\x40"
"\x18\x30\x60\xc0\x60\x30\x18\x00\x00\x00\xf8\x00\xf8\x00\x00\x00"
"\xc0\x60\x30\x18\x30\x60\xc0\x00\x70\x88\x08\x10\x20\x00\x20\x00"
"\x70\x88\x08\x68\xa8\xa8\x70\x00\x20\x50\x88\x88\xf8\x88\x88\x00"
"\xf0\x48\x48\x70\x48\x48\xf0\x00\x30\x48\x80\x80\x80\x48\x30\x00"
"\xe0\x50\x48\x48\x48\x50\xe0\x00\xf8\x80\x80\xf0\x80\x80\xf8\x00"
"\xf8\x80\x80\xf0\x80\x80\x80\x00\x70\x88\x80\xb8\x88\x88\x70\x00"
"\x88\x88\x88\xf8\x88\x88\x88\x00\x70\x20\x20\x20\x20\x20\x70\x00"
"\x38\x10\x10\x10\x90\x90\x60\x00\x88\x90\xa0\xc0\xa0\x90\x88\x00"
"\x80\x80\x80\x80\x80\x80\xf8\x00\x88\xd8\xa8\xa8\x88\x88\x88\x00"
"\x88\xc8\xc8\xa8\x98\x98\x88\x00\x70\x88\x88\x88\x88\x88\x70\x00"
"\xf0\x88\x88\xf0\x80\x80\x80\x00\x70\x88\x88\x88\xa8\x90\x68\x00"
"\xf0\x88\x88\xf0\xa0\x90\x88\x00\x70\x88\x80\x70\x08\x88\x70\x00"
"\xf8\x20\x20\x20\x20\x20\x20\x00\x88\x88\x88\x88\x88\x88\x70\x00"
"\x88\x88\x88\x88\x50\x50\x20\x00\x88\x88\x88\xa8\xa8\xd8\x88\x00"
"\x88\x88\x50\x20\x50\x88\x88\x00\x88\x88\x88\x70\x20\x20\x20\x00"
"\xf8\x08\x10\x20\x40\x80\xf8\x00\x70\x40\x40\x40\x40\x40\x70\x00"
"\x00\x00\x80\x40\x20\x10\x08\x00\x70\x10\x10\x10\x10\x10\x70\x00"
"\x20\x50\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00"
"\x40\x20\x10\x00\x00\x00\x00\x00\x00\x00\x70\x08\x78\x88\x78\x00"
"\x80\x80\xb0\xc8\x88\xc8\xb0\x00\x00\x00\x70\x88\x80\x88\x70\x00"
"\x08\x08\x68\x98\x88\x98\x68\x00\x00\x00\x70\x88\xf8\x80\x70\x00"
"\x10\x28\x20\xf8\x20\x20\x20\x00\x00\x00\x68\x98\x98\x68\x08\x70"
"\x80\x80\xf0\x88\x88\x88\x88\x00\x20\x00\x60\x20\x20\x20\x70\x00"
"\x10\x00\x30\x10\x10\x10\x90\x60\x40\x40\x48\x50\x60\x50\x48\x00"
"\x60\x20\x20\x20\x20\x20\x70\x00\x00\x00\xd0\xa8\xa8\xa8\xa8\x00"
"\x00\x00\xb0\xc8\x88\x88\x88\x00\x00\x00\x70\x88\x88\x88\x70\x00"
"\x00\x00\xb0\xc8\xc8\xb0\x80\x80\x00\x00\x68\x98\x98\x68\x08\x08"
"\x00\x00\xb0\xc8\x80\x80\x80\x00\x00\x00\x78\x80\xf0\x08\xf0\x00"
"\x40\x40\xf0\x40\x40\x48\x30\x00\x00\x00\x90\x90\x90\x90\x68\x00"
"\x00\x00\x88\x88\x88\x50\x20\x00\x00\x00\x88\xa8\xa8\xa8\x50\x00"
"\x00\x00\x88\x50\x20\x50\x88\x00\x00\x00\x88\x88\x98\x68\x08\x70"
"\x00\x00\xf8\x10\x20\x40\xf8\x00\x18\x20\x20\x40\x20\x20\x18\x00"
"\x20\x20\x20\x00\x20\x20\x20\x00\xc0\x20\x20\x10\x20\x20\xc0\x00"
"\x40\xa8\x10\x00\x00\x00\x00\x00\x00\x00\x20\x50\xf8\x00\x00\x00"
"\x70\x88\x80\x80\x88\x70\x20\x60\x90\x00\x00\x90\x90\x90\x68\x00"
"\x10\x20\x70\x88\xf8\x80\x70\x00\x20\x50\x70\x08\x78\x88\x78\x00"
"\x48\x00\x70\x08\x78\x88\x78\x00\x20\x10\x70\x08\x78\x88\x78\x00"
"\x20\x00\x70\x08\x78\x88\x78\x00\x00\x70\x80\x80\x80\x70\x10\x60"
"\x20\x50\x70\x88\xf8\x80\x70\x00\x50\x00\x70\x88\xf8\x80\x70\x00"
"\x20\x10\x70\x88\xf8\x80\x70\x00\x50\x00\x00\x60\x20\x20\x70\x00"
"\x20\x50\x00\x60\x20\x20\x70\x00\x40\x20\x00\x60\x20\x20\x70\x00"
"\x50\x00\x20\x50\x88\xf8\x88\x00\x20\x00\x20\x50\x88\xf8\x88\x00"
"\x10\x20\xf8\x80\xf0\x80\xf8\x00\x00\x00\x6c\x12\x7e\x90\x6e\x00"
"\x3e\x50\x90\x9c\xf0\x90\x9e\x00\x60\x90\x00\x60\x90\x90\x60\x00"
"\x90\x00\x00\x60\x90\x90\x60\x00\x40\x20\x00\x60\x90\x90\x60\x00"
"\x40\xa0\x00\xa0\xa0\xa0\x50\x00\x40\x20\x00\xa0\xa0\xa0\x50\x00"
"\x90\x00\x90\x90\xb0\x50\x10\xe0\x50\x00\x70\x88\x88\x88\x70\x00"
"\x50\x00\x88\x88\x88\x88\x70\x00\x20\x20\x78\x80\x80\x78\x20\x20"
"\x18\x24\x20\xf8\x20\xe2\x5c\x00\x88\x50\x20\xf8\x20\xf8\x20\x00"
"\xc0\xa0\xa0\xc8\x9c\x88\x88\x8c\x18\x20\x20\xf8\x20\x20\x20\x40"
"\x10\x20\x70\x08\x78\x88\x78\x00\x10\x20\x00\x60\x20\x20\x70\x00"
"\x20\x40\x00\x60\x90\x90\x60\x00\x20\x40\x00\x90\x90\x90\x68\x00"
"\x50\xa0\x00\xa0\xd0\x90\x90\x00\x28\x50\x00\xc8\xa8\x98\x88\x00"
"\x00\x70\x08\x78\x88\x78\x00\xf8\x00\x60\x90\x90\x90\x60\x00\xf0"
"\x20\x00\x20\x40\x80\x88\x70\x00\x00\x00\x00\xf8\x80\x80\x00\x00"
"\x00\x00\x00\xf8\x08\x08\x00\x00\x84\x88\x90\xa8\x54\x84\x08\x1c"
"\x84\x88\x90\xa8\x58\xa8\x3c\x08\x20\x00\x00\x20\x20\x20\x20\x00"
"\x00\x00\x24\x48\x90\x48\x24\x00\x00\x00\x90\x48\x24\x48\x90\x00"
"\x28\x50\x20\x50\x88\xf8\x88\x00\x28\x50\x70\x08\x78\x88\x78\x00"
"\x28\x50\x00\x70\x20\x20\x70\x00\x28\x50\x00\x20\x20\x20\x70\x00"
"\x28\x50\x00\x70\x88\x88\x70\x00\x50\xa0\x00\x60\x90\x90\x60\x00"
"\x28\x50\x00\x88\x88\x88\x70\x00\x50\xa0\x00\xa0\xa0\xa0\x50\x00"
"\xfc\x48\x48\x48\xe8\x08\x50\x20\x00\x50\x00\x50\x50\x50\x10\x20"
"\xc0\x44\xc8\x54\xec\x54\x9e\x04\x10\xa8\x40\x00\x00\x00\x00\x00"
"\x00\x20\x50\x88\x50\x20\x00\x00\x88\x10\x20\x40\x80\x28\x00\x00"
"\x7c\xa8\xa8\x68\x28\x28\x28\x00\x38\x40\x30\x48\x48\x30\x08\x70"
"\x00\x00\x00\x00\x00\x00\xff\xff\xf0\xf0\xf0\xf0\x0f\x0f\x0f\x0f"
"\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x3c\x3c\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00"
"\xc0\xc0\xc0\xc0\xc0\xc0\xc0\xc0\x0f\x0f\x0f\x0f\xf0\xf0\xf0\xf0"
"\xfc\xfc\xfc\xfc\xfc\xfc\xfc\xfc\x03\x03\x03\x03\x03\x03\x03\x03"
"\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x3f\x11\x22\x44\x88\x11\x22\x44\x88"
"\x88\x44\x22\x11\x88\x44\x22\x11\xfe\x7c\x38\x10\x00\x00\x00\x00"
"\x00\x00\x00\x00\x10\x38\x7c\xfe\x80\xc0\xe0\xf0\xe0\xc0\x80\x00"
"\x01\x03\x07\x0f\x07\x03\x01\x00\xff\x7e\x3c\x18\x18\x3c\x7e\xff"
"\x81\xc3\xe7\xff\xff\xe7\xc3\x81\xf0\xf0\xf0\xf0\x00\x00\x00\x00"
"\x00\x00\x00\x00\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x00\x00\x00\x00"
"\x00\x00\x00\x00\xf0\xf0\xf0\xf0\x33\x33\xcc\xcc\x33\x33\xcc\xcc"
"\x00\x20\x20\x50\x50\x88\xf8\x00\x20\x20\x70\x20\x70\x20\x20\x00"
"\x00\x00\x00\x50\x88\xa8\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff"
"\x00\x00\x00\x00\xff\xff\xff\xff\xf0\xf0\xf0\xf0\xf0\xf0\xf0\xf0"
"\x0f\x0f\x0f\x0f\x0f\x0f\x0f\x0f\xff\xff\xff\xff\x00\x00\x00\x00"
"\x00\x00\x68\x90\x90\x90\x68\x00\x30\x48\x48\x70\x48\x48\x70\xc0"
"\xf8\x88\x80\x80\x80\x80\x80\x00\xf8\x50\x50\x50\x50\x50\x98\x00"
"\xf8\x88\x40\x20\x40\x88\xf8\x00\x00\x00\x78\x90\x90\x90\x60\x00"
"\x00\x50\x50\x50\x50\x68\x80\x80\x00\x50\xa0\x20\x20\x20\x20\x00"
"\xf8\x20\x70\xa8\xa8\x70\x20\xf8\x20\x50\x88\xf8\x88\x50\x20\x00"
"\x70\x88\x88\x88\x50\x50\xd8\x00\x30\x40\x40\x20\x50\x50\x50\x20"
"\x00\x00\x00\x50\xa8\xa8\x50\x00\x08\x70\xa8\xa8\xa8\x70\x80\x00"
"\x38\x40\x80\xf8\x80\x40\x38\x00\x70\x88\x88\x88\x88\x88\x88\x00"
"\x00\xf8\x00\xf8\x00\xf8\x00\x00\x20\x20\xf8\x20\x20\x00\xf8\x00"
"\xc0\x30\x08\x30\xc0\x00\xf8\x00\x18\x60\x80\x60\x18\x00\xf8\x00"
"\x10\x28\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\xa0\x40"
"\x00\x20\x00\xf8\x00\x20\x00\x00\x00\x50\xa0\x00\x50\xa0\x00\x00"
"\x00\x18\x24\x24\x18\x00\x00\x00\x00\x30\x78\x78\x30\x00\x00\x00"
"\x00\x00\x00\x00\x30\x00\x00\x00\x3e\x20\x20\x20\xa0\x60\x20\x00"
"\xa0\x50\x50\x50\x00\x00\x00\x00\x40\xa0\x20\x40\xe0\x00\x00\x00"
"\x00\x38\x38\x38\x38\x38\x38\x00\x00\x00\x00\x00\x00\x00\x00";
